const coinChange = (coins: Array<number>, amount: number) => {
  // 用于保存每个目标总额对应的硬币数量
  const f: Array<number> = [];
  // 提前定义已知情况
  f[0] = 0;
  // 遍历1到amount这个区间的硬币总额
  for (let index = 1; index < amount; index++) {
    // 求的是最小值,因此我们因此我们预设为无穷大，确保它一定会被更小的数更新
    f[index] = Infinity;
    // 遍历每个可用硬币面值总额
    for (let j = 0; j < coins.length; j++) {
      // 若硬币面额小于目标总额，则问题成立
      if (index - coins[j] >= 0) {
        f[index] = Math.min(f[index], f[index - coins[j]] + 1);
      }
    }
  }
  // 若目标总额对应的解为无穷大，则意味着没有一个符合条件的硬币总数来更新它，本题无解，返回-1
  if (f[amount] === Infinity) {
    return -1;
  }
  // 若有解，直接返回解的内容
  return f[amount];
};

function say<T>(args: T) {
  return args;
}

